`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/02/27 11:26:59
// Design Name: 
// Module Name: testbench_demo
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


//testbench


// 定义一个名为testbench_demo的模块
module testbench_demo;

// 定义一个名为PERIOD的参数，并初始化为10
// 这个参数用于定义时钟信号的周期
parameter PERIOD  = 10;

// 输入定义部分

// 定义一个名为clk的寄存器，初始值为0
// 用于模拟时钟信号
reg clk=0;

// 定义一个名为rst_n的寄存器，初始值为0
// 用于模拟复位信号
reg rst_n=0;

// 定义一个4位宽的寄存器i_data，初始值为0
// 用于模拟输入数据
reg [3:0] i_data;

// 定义一个4位宽的寄存器q_data，初始值为0
// 用于模拟另一个输入数据
reg [3:0] q_data;

// 定义一个名为ready_in的寄存器，初始值为0
// 用于模拟一个开关信号
reg ready_in=0;

// 定义一个2位宽的寄存器sel，初始值为0
// 用于模拟选择信号
reg [1:0] sel=0;

// 输出定义部分

// 定义一个5位宽的数据包out_data
// 这个数据包用于接收模块demo的输出数据
wire [4:0] out_data;

// 定义一个名为ready_out的数据包
// 这个数据包用于接收模块demo的输出开关信号
wire ready_out;

// 生成时钟信号
initial
begin
 // 使用forever循环，每隔PERIOD/2的时间单位，clk寄存器的值取反
 // 这生成一个频率为PERIOD/2的时钟信号
  forever #(PERIOD/2) clk=~clk; 
end

// 生成输入信号
initial
begin
 // 等待2个时钟周期后，复位信号rst_n设置为1
  #(PERIOD*2) rst_n = 1;

 // 等待200个时间单位后，设置i_data为4'd5，q_data为4'ha
  #200
  i_data = 4'd5;
  q_data = 4'ha;

 // 再等待100个时间单位后，ready_in设置为1，sel设置为2'b10
  #100
  ready_in = 1;
  sel = 2'b10;
end

// 例化demo模块
// 连接testbench的输出和输入到demo模块的相应端口
demo u_demo(
  .clk(clk),        // 时钟信号连接到demo模块的clk端口
  .rst_n(rst_n),    // 复位信号连接到demo模块的rst_n端口
  .i_data(i_data),  // 输入数据i_data连接到demo模块的i_data端口
  .q_data(q_data),  // 输入数据q_data连接到demo模块的q_data端口
  .ready_in(ready_in), // 开关信号ready_in连接到demo模块的ready_in端口
  .sel(sel),        // 选择信号sel连接到demo模块的sel端口
  .out_data(out_data), // demo模块的输出数据连接到testbench的out_data数据包
  .ready_out(ready_out) // demo模块的输出开关信号连接到testbench的ready_out数据包
);

// 结束模块定义
endmodule